import { ref } from 'vue'
import Web3 from 'web3/dist/web3.min.js'
import { toast } from '@/style'
import { t } from '@/lang'

// web3
const web3 = new Web3

// 钱包地址 
const wallet = ref('')

// 引导方法
const init = async(next) => {
  // 是否在钱包浏览器
  if(typeof window.ethereum === "undefined") {
    return toast(t('ethereum'), 'info', 0)
  }

  // 切换网络链
  toast(t('ethereum_chain'), 'ring', 0)
  await ethereum.request({
    method: 'wallet_switchEthereumChain',
    params: [{ chainId: import.meta.env.VITE_WEB3_CHAIN_ID }],
  });

  // 连接web3
  toast(t('boot'), 'ring', 0)

  // 连接当前链
  web3.setProvider(Web3.givenProvider)

  // 开始授权
  ethereum.request({method: 'eth_requestAccounts'}).then(res => {
    // 钱包地址 
    wallet.value = res[0]
    console.log(wallet.value)

    // 进入下一步
    setTimeout(() => {
      toast(false)
      next()
    }, 1000)
  }).catch(error => {
    toast(t('ethereum_account'))
  })
  
  // 监听帐号变化事件
  ethereum.on('accountsChanged', function () {
    window.history.go(0)
  })
  
  // 监听网络切换
  ethereum.on('networkChanged', function () {
    window.history.go(0)
  })
}

// 代币格式化
const amountFormat = (money, decimal = 18) => {
  money = money.toString()
  // 分割
  const math = money.split(".")
  const dec = math[1] ? math[1] : '0'
  // 连接
  return math[0] + dec.padEnd(decimal, '0')
}

// 数据打包
const packager = data => {
  // 打包数据
  const message = web3.utils.stripHexPrefix(
    web3.utils.toHex(JSON.stringify(data))
  )
  // 生成签名
  return new Promise((resolve, reject) => { 
    web3.eth.personal.sign(message, wallet.value).then(sign => {
      // 打包数据
      resolve(web3.eth.abi.encodeParameters(['string', 'bytes'], [message, sign]))
    }).catch(() => {
      reject()
    })
  })
}

// 随机
const random = (size = 32) => {
  return web3.utils.randomHex(size)
}

// 授权生成令牌
const makeAuth = async () => {
  localStorage.setItem(wallet.value, await packager({ random: random() }))
}

// 获取令牌
const getAuth = () => {
  return localStorage.getItem(wallet.value)
}

// 代币格式化
const formWei = (money, type = 'ether') => {
  return web3.utils.fromWei(money, type);
}

const toWei = (money, type = 'ether') => {
  return web3.utils.toWei(money, type);
}

export {wallet, init, amountFormat, packager, random, makeAuth, getAuth, formWei, toWei}
export default web3